package com.oracle.application.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * @author 莉丝妲黛
 */
@Configuration
public class RabbitMqConfig {

    /**
     * 声明一个队列
     * @return
     */
    @Bean
    public Queue orderCreateQueue(){
        Map<String, Object>map=new HashMap<>();
        map.put("x-message-ttl",1000*60*1);
        map.put("x-dead-letter-exchange", "dlxExchange");
        map.put("x-dead-letter-routing-key","#");
        //设置队列的 名称 同时也可以设置 队列的其他属性 默认只给了名字
        return new Queue("orderCreateQueue",false,false,false,map);
    }

    /**
     * 声明交换机 可以通过不同类型的交换机进行声明配置
     * @return
     */
    @Bean
    public DirectExchange orderCreateExchange(){
        return new DirectExchange("orderCreateExchange");
    }

    /**
     * 将队列与交换机进行绑定
     * @return
     */
    @Bean
    public Binding queueExchangeBind(){
        //创建 队列与交换机之间的绑定关系  设置一个绑定的key 为MQ
        return BindingBuilder.bind(orderCreateQueue()).to(orderCreateExchange()).with("order.create");
    }

    /**
     * 创建死信队列
     * @return
     */
    @Bean
    public Queue orderDlxQueue(){
        return new Queue("orderDlxQueue");
    }

    /**
     * 死信交换机
     * @return
     */
    @Bean
    public DirectExchange dlxExchange(){
        return  new DirectExchange("dlxExchange");
    }

    /**
     * 绑定死信交换机
     * @return
     */
    @Bean
    public Binding dlxAndDlxExchange(){
        return BindingBuilder.bind(orderDlxQueue()).to(dlxExchange()).with("#");
    }
}
